import Koa from 'koa';
import bodyParser from 'koa-bodyparser';
import helmet from 'koa-helmet';
import compress from 'koa-compress';
import cors from '@koa/cors';
import http from 'http';
import config from './config';
import sequelize from './db';
import logger from './utils/logger';
import router from './routes';
import {
  errorHandler,
  tenantIdentifier,
  requestLogger,
} from './middlewares';
// 导入模型以初始化关联关系
import './models';
import { initMinIO } from './config/minio';
import { wsServer } from './utils/websocket';

/**
 * 创建 Koa 应用
 */
const app = new Koa();

/**
 * 全局中间件
 */

// 错误处理（必须在最前面）
app.use(errorHandler);

// 安全头
app.use(helmet());

// CORS - 允许所有来源（开发环境），包括内网IP访问
app.use(
  cors({
    origin: (ctx) => {
      const origin = ctx.get('Origin');
      // 开发环境允许所有来源
      if (config.env === 'development') { 
        return origin || '*';
      }
      // 生产环境只允许特定域名
      if (origin && origin.includes(config.app.domain)) {
        return origin;
      }
      return '';
    },
    credentials: true,
    allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Requested-With'],
    exposeHeaders: ['Content-Length', 'Content-Type'],
    maxAge: 86400, // 24小时
  }),
);

// 请求体解析
app.use(
  bodyParser({
    enableTypes: ['json', 'form'],
    jsonLimit: '10mb',
    formLimit: '10mb',
  }),
);

// 响应压缩
app.use(compress());

// 请求日志
app.use(requestLogger);

// 租户识别（在需要的路由上）
app.use(tenantIdentifier);

/**
 * 路由
 */
app.use(router.routes());
app.use(router.allowedMethods());

/**
 * 获取本机局域网IP地址
 */
function getLocalIPAddress(): string {
  const os = require('os');
  const networkInterfaces = os.networkInterfaces();
  
  for (const interfaceName in networkInterfaces) {
    const interfaces = networkInterfaces[interfaceName];
    if (!interfaces) continue;
    
    for (const iface of interfaces) {
      // 跳过内部地址、IPv6地址和非活动接口
      if (iface.family === 'IPv4' && !iface.internal) {
        return iface.address;
      }
    }
  }
  
  return 'localhost';
}

/**
 * 启动服务器
 */
async function startServer() {
  try {
    // 测试数据库连接
    await sequelize.authenticate();
    logger.info('数据库连接成功');

    // 初始化 MinIO（非阻塞）
    await initMinIO();

    const localIP = getLocalIPAddress();

    // 创建 HTTP 服务器
    const server = http.createServer(app.callback());

    // 初始化 WebSocket 服务器
    wsServer.initialize(server);

    // 启动服务器（监听所有网络接口）
    server.listen(config.port, '0.0.0.0', () => {
      logger.info(`
        ========================================
        服务器启动成功
        ========================================
        环境: ${config.env}
        端口: ${config.port}
        时间: ${new Date().toLocaleString()}
        ========================================
        本地访问: http://localhost:${config.port}/api
        局域网访问: http://${localIP}:${config.port}/api
        健康检查: http://localhost:${config.port}/health
        WebSocket: ws://localhost:${config.port}/ws
        ========================================
        默认超级管理员账号:
        邮箱: admin@saas.com
        密码: Admin@123456
        ========================================
      `);
    });
  } catch (error) {
    logger.error('服务器启动失败:', error);
    process.exit(1);
  }
}

/**
 * 退出
 */
const gracefulShutdown = async (_signal: string) => {
  try {
    // 关闭 WebSocket 服务器
    wsServer.close();
    
    // 关闭数据库连接
    await sequelize.close();
    logger.info('数据库连接已关闭');
    process.exit(0);
  } catch (error) {
    logger.error('优雅退出失败:', error);
    process.exit(1);
  }
};

process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
process.on('SIGINT', () => gracefulShutdown('SIGINT'));

// 捕获未处理的异常
process.on('uncaughtException', (error) => {
  logger.error('未捕获的异常:', error);
  process.exit(1);
});

process.on('unhandledRejection', (reason, promise) => {
  logger.error('未处理的 Promise 拒绝:', { reason, promise });
});

// 启动服务器
startServer();

export default app;
